//给定一个已排序的链表的头
// head ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。 
//
// 
//
// 示例 1： 
// 
// 
//输入：head = [1,1,2]
//输出：[1,2]
// 
//
// 示例 2： 
// 
// 
//输入：head = [1,1,2,3,3]
//输出：[1,2,3]
// 
//
// 
//
// 提示： 
//
// 
// 链表中节点数目在范围 [0, 300] 内 
// -100 <= Node.val <= 100 
// 题目数据保证链表已经按升序 排列 
// 
//
// Related Topics 链表 👍 882 👎 0


package leetcode.editor.cn;

public class RemoveDuplicatesFromSortedList{
  public static void main(String[] args) {
       Solution solution = new RemoveDuplicatesFromSortedList().new Solution();
  }
  //leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 */

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }
        //cur不是新开的链表，cur只是一个引用类型的变量，相当于一个内存指针，这里的head也是一个指针，它指向的是链表开始位置的内存，
        // 让cur = head，表示cur和head指向了同一块内存，也就是说这俩指针都存储了相同的内存地址，如果直接操作head，
        // 那么你就丢失了链表起始位置的内存地址，测试程序就没办法从头开始遍历链表了，
        // 所以需要使用cur来遍历链表，同时直接对指向的内存数据进行操作，这样返回的head仍然指向链表开始位置的内存，而这个链表其实已经使用cur这个指针进行了修改了。
        ListNode cur = head;
        while (cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            }else {
                cur = cur.next;
            }
        }
        return head;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

/**
 * 把ListNode 定义到提交区外，避免报
 * java.lang.NoSuchMethodError: 'ListNode ListNode.deserialize(java.lang.String)'
 *     at __Deserializer__.toListNode(Unknown Source)
 *     at line 80, __Driver__.main
 *
 * 原因：想下它这个是怎么测试的, 它生成的方法也没有一个类似于数组的入参(然后我们再把数组转成链表), 入参直接就是ListNode.
 * 那应该它那边就有这么个类ListNode, 且这个类里就有这个反序列化方法, 它初始化测试用例的时候就已经传入的ListNode本身
 * 所以我们不应该把ListNode也作为代码传过去覆盖它自身的这个类, 这是提供给我们本地编译不报错的, 所以只需要把ListNode移到提交区外就行
 * https://blog.csdn.net/zzzgd_666/article/details/124843959
*/
public class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
}